var that, source;
let newAudioBuffer = '',
    start_time = '',
    end_time = '';

Page({

    innerAudioContext: null,

    data: {
        slider: [0, 50],
        minHour: '00',
        maxHour: '06',
        audioCtx: null, //音频对象
        play: {
            currentTime: '00.00', // 当前时间
            duration: '00.00', // 歌曲总时间
            percent: 0, // 播放进度
        },
        cutOutStartTime: '', //裁剪开始的时间
        cutOutEndTime: '', //裁剪结束的时间
    },

    onLoad: function (options) {
        that = this;
        that.initPlay();
    },

    //初始化要播放的
    initPlay: function () {
        that.innerAudioContext = wx.createInnerAudioContext({
            useWebAudioImplement: false // 是否使用 WebAudio 作为底层音频驱动，默认关闭。对于短音频、播放频繁的音频建议开启此选项，开启后将获得更优的性能表现。由于开启此选项后也会带来一定的内存增长，因此对于长音频建议关闭此选项
        })
        that.innerAudioContext.src = '/media/a.mp3'
        //监听音频播放进度更新事件
        that.innerAudioContext.onTimeUpdate(function () {
            // console.log('这个回传的时间是个啥：',res);
            that.setData({
                //获取总时间
                'play.duration': that.formatTime(that.innerAudioContext.duration),
                //当前歌曲播放的时长
                'play.currentTime': that.formatTime(that.innerAudioContext.currentTime),
                'play.percent': that.innerAudioContext.currentTime / that.innerAudioContext.duration * 100
            })
        })
    },

    // 格式化时间
    formatTime: function (time) {
        var minute = Math.floor(time / 60) % 60;
        var second = Math.floor(time) % 60;
        return (minute < 10 ? '0' + minute : minute) + ":" +
            (second < 10 ? '0' + second : second)
    },

    //点击事件的回调
    onClick: function (res) {
        // console.log("res",res);
        let id = res.currentTarget.id;
        if (id == "play") {
            that.innerAudioContext.src('cloud://zbdc-6gavbhj633c62e27.7a62-zbdc-6gavbhj633c62e27-1309571621/blue.mp3')
            that.innerAudioContext.play() // 播放
        } else if (id == "pause") {
            that.innerAudioContext.pause() // 暂停
        } else if (id == "stop") {
            that.innerAudioContext.stop() // 停止
        } else if (id == "splite") {
            that.setMusic();
        } else if (id == "spliteStop") {
            that.stopSplite();
        }
    },

    // 手动控制进度
    sliderChange: function (e) {
        console.log('拖动进行回传的：', e);
        var Second = e.detail.value * that.innerAudioContext.duration / 100
        // //跳到指定位置
        that.innerAudioContext.seek(Second)
    },

    // 将分秒转换成秒
    reFormatTime(retime) {
        console.log(retime)
        for (let i = 0; i++, i < retime.length;) {
            if (retime.indexOf(':') !== -1) {
                return Number(retime.split(':')[0] * 60) + Number(retime.split(':')[1])
            }
        }
    },

    // 获取flask的音频资源
    async getFlskAudio() {
        await wx.request({
            url: 'http://47.94.230.102/roc',
            method: 'get',
            dataType: 'json',
            responseType: 'arraybuffer',
            success: function (res) {
                console.log("音频资源", res)
                let filePath = `${wx.env.USER_DATA_PATH}/cs.mp3`
                wx.getFileSystemManager().writeFile({
                    filePath: filePath,
                    data: res.data,
                    encoding: 'binary',
                    success: (res) => {
                        wx.hideLoading() //让提示框隐藏、消失
                        console.log('写入成功, 路径: ', res, filePath);
                        // wx.saveVideoToPhotosAlbum({ // 新开页面打开文档
                        //   filePath: wx.env.USER_DATA_PATH + "/myvideo.mp3",  //拿上面存入的文件路径
                        //   success: function (res) {
                        //   }
                        // })
                        // return
                        wx.request({
                            url: 'http://47.94.230.102/removeFile',
                            method: 'get',
                            responseType:'josn',
                            success (res) {
                                console.log(res)
                            }
                        })
                    }
                })
            },

        })
    },

    // 上传音频到flask
    async postFlskAudio(audio, cutOutStartTime, cutOutEndTime) {
        console.log(audio, typeof audio)
        await wx.showLoading({ //显示加载提示框 不会自动关闭 只能wx.hideLoading关闭
            title: '音频上传中', //提示框显示的提示信息
            mask: true, //
        });
        wx.uploadFile({
            filePath: audio.path,
            name: 'file',
            url: 'http://47.94.230.102/cutAudio',
            header: {
                'content-type': 'multipart/form-data'
            },
            formData: { // 音频文件、开始时间、结束时间
                "audio_file": audio.name,
                // wx.getFileSystemManager().readFile({
                //   filePath: audio.name, // 这里的路径可以在上一步打印一下，然后填写即可
                //   encoding: 'binary'
                // }),
                'audioName': 'csAudio',
                // TODO
                "start_time": '00:12',
                "end_time": '00:24'
            },
            success: function (res) {
                that.getFlskAudio()
            },
            fail: function (err) {
                console.log(err)
            }
        })
    },

    //input的输入
    enterValue: function (res) {
        console.log('res = ', res);
        let id = res.currentTarget.id;
        let inputValue = res.detail.value;
        let reFormValue = that.reFormatTime(inputValue);
        console.log('id = ', id, "  inputValue = ", inputValue, '  formatTime = ', reFormValue);
    },

    // 时间选择器的点击事件
    openPicker(e) {
        console.log(e, e.currentTarget.id)
        if (e.currentTarget.id == '1') {
            this.setData({ startShow: true })
        } else if (e.currentTarget.id == '2') {
            this.setData({ endShow: true })
        }
    },
    onConfirm(e) {
        console.log(e, e.currentTarget.id)
        if (e.currentTarget.id == '1') {
            this.setData({ startCurrtime: e.detail, startShow: false })
            start_time = e.detail
            console.log('start_time', start_time)
        } else if (e.currentTarget.id == '2') {
            this.setData({ endCurrtime: e.detail, endShow: false })
            end_time = e.detail
            console.log('end_time', end_time)
        }
    },
    onClose(e) {
        console.log('关闭')
        if (e.currentTarget.id == '1') {
            this.setData({ startShow: false })
        } else if (e.currentTarget.id == '2') {
            this.setData({ endShow: false })
        }
    },
    onCancel(e) {
        console.log('取消')
        if (e.currentTarget.id == '1') {
            this.setData({ startShow: false })
        } else if (e.currentTarget.id == '2') {
            this.setData({ endShow: false })
        }
    },


    //开始切割, 进行真正切割的
    async startSplite() {
        //获取音频播放对象
        const audioCtx = wx.createWebAudioContext()
        await wx.request({
            url: that.data.audioUrl, // 音频 url
            responseType: 'arraybuffer',
            success: res => {
                //异步解码一段资源为AudioBuffer。
                audioCtx.decodeAudioData(res.data, audioBuffer => {
                    console.log('原始解析的audioBuffer， 成功解析：', audioBuffer);
                    // 储存在缓存区的 PCM 数据的通道数
                    let channels = audioBuffer.numberOfChannels;
                    // 存储在缓存区的 PCM 数据的采样率（单位为sample/s)
                    let rate = audioBuffer.sampleRate;
                    //开始计算的帧数

                    let startFrameCount = rate * that.reFormatTime(start_time);
                    // 截取X秒
                    let startOffset = that.reFormatTime(start_time);
                    let endOffset = that.reFormatTime(end_time);
                    // x秒对应的帧数
                    let frameCount = (endOffset - startOffset) * rate;
                    // 创建同样采用率、同样声道数量，长度是前x秒的空的AudioBuffer
                    newAudioBuffer = new AudioContext().createBuffer(channels, frameCount, rate);
                    //创建一个AudioBuffer，代表着一段驻留在内存中的短音频
                    console.log('新的，截取的 newAudioBuffer = ', newAudioBuffer);
                    // 创建临时的Array存放复制的buffer数据
                    let anotherArray = new Float32Array(frameCount);
                    // console.log('创建临时的Array存放复制的buffer数据 anotherArray = ',anotherArray);
                    // 声道的数据的复制和写入
                    let offset = 0;
                    for (let channel = 0; channel < channels; channel++) {
                        //从 AudioBuffer 的指定频道复制到数组终端
                        audioBuffer.copyFromChannel(anotherArray, channel, startFrameCount);
                        //从指定数组复制样本到 audioBuffer 的特定通道
                        newAudioBuffer.copyToChannel(anotherArray, channel, offset);
                    }
                    //创建一个 BufferSourceNode 实例，通过 AudioBuffer 对象来播放音频数据
                    source = audioCtx.createBufferSource();
                    // 设置AudioBufferSourceNode对象的buffer为复制的AudioBuffer对象
                    source.buffer = newAudioBuffer;
                    // 这里直接结束，实际上可以对结束做一些特效处理
                    source.connect(audioCtx.destination);
                    // 资源开始播放
                    source.start();
                    // this.audioBufferToWav(newAudioBuffer)
                }, err => {
                    console.error('decodeAudioData fail', err)
                })
            }
        })
    },

    //分割停止
    stopSplite: function () {
        if (source) {
            source.stop();
        }
    },

    //选择本地的音乐
    async setMusic() {
        console.log("开始时间:", start_time, "结束时间：", end_time)
        if (start_time && end_time) {
            console.log('开始选择文件')
            await wx.chooseMessageFile({
                count: 1,
                type: 'file',
                extension: ['mp3'],
                success(res) {
                    console.log('选择文件', res)
                    // return
                    // tempFilePath可以作为 img 标签的 src 属性显示图片
                    let music = res.tempFiles[0]
                    that.setData({
                        audioUrl: music.path
                    })
                    that.postFlskAudio(music, start_time, end_time)
                    that.startSplite();
                }
            })
        } else {
            wx.showToast({
                title: '请输入要裁剪的开始和结束的时间',
                duration: 2000,
                icon: 'error',
                mask: false
            })
        }
    },

    async upAudioFile(buffer) {
        // let bufferAdo = await wx.getFileSystemManager().readFileSync(newAudioBuffer)
        wx.showLoading({
            title: '加载中',
        })
        await wx.cloud.uploadFile({
            cloudPath: `Audio/cs.mp3`,
            fileContent: Buffer.from(buffer), //处理buffer 二进制数据
            success: res => {
                // 文件地址
                wx.hideLoading({
                    success: (res) => { },
                })
                console.log(res)
            },
            fail: err => {
                console.log(err)
            }
        })

    },

    onUnload() {
        newAudioBuffer = ''
        console.log('newAudioBuffer', newAudioBuffer)
    },
})